package concurrencyCookBook.semaphore;

import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
/**
 * 信号量分为公平和非公平，可由构造方法控制
 * @author jiejie
 *int availablePermits() ：返回此信号量中当前可用的许可证数。
 *int getQueueLength()：返回正在等待获取许可证的线程数。
 *boolean hasQueuedThreads() ：是否有线程正在等待获取许可证。
 *void reducePermits(int reduction) ：减少reduction个许可证。是个protected方法。
 *Collection getQueuedThreads() ：返回所有等待获取许可证的线程集合。是个protected方法
 */
public class CommonResource {
	private Integer age=0;
	private String name;
	//声明信号量
	private final Semaphore semaphore;
	public CommonResource(){
		//初始化一个值为大于0的数,如果为几表示最多可以由几个线程同时访问
		semaphore=new Semaphore(2);
	}
	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public void dealResource(){
		try {
			//获取信号量,如果大于1表示有可能有可用资源
			System.out.println(semaphore.availablePermits()+"==availablePermits");
			semaphore.acquire();
			System.out.println(semaphore.getQueueLength()+"==QueueLength");
			/*//和上面的类似,不过这个线程在阻塞这段时间不会抛异常
			semaphore.acquireUninterruptibly();*/
			TimeUnit.SECONDS.sleep(2);
			age++;
			this.setName("name"+age);
			System.out.println("ThreadName:"+Thread.currentThread().getName());
			System.out.println(this.getName());
		} catch (InterruptedException e) {
			e.printStackTrace();
		}finally{
			//最后必须释放信号量
			semaphore.release();
		}
	}
}
